package Model;

import java.util.Iterator;
import java.util.Stack;

import Model.Evenement.Evenement;

/**
 * Cette class permet de gérer l'historique d'un dessin.
 * 
 * @author Kilian Cousein et Benjamin Tardieu
 */
public class Historique
{
//======================================================================//
//============================ Variables ===============================//
//======================================================================//
	
	private Stack<Evenement> historiqueAnnuler = new Stack(); // historique d'évènement annuler
	private Stack<Evenement> historiqueRetablir = new Stack(); // historique d'évènement rétablir
	
	
//======================================================================//
//============================= Méthodes ===============================//
//======================================================================//
	
	/**
	 * Cette méthode permet d'ajouter un <i>Evenement</i> dans l'historique d'annulation.
	 */
	public void ajouterEvenement(Evenement evenement)
	{
		this.historiqueAnnuler.add(evenement);
	}
	

	/**
	 * Cette méthode permet de retirer un <i>Evenement</i> dans l'historique d'annulation et de l'ajouter dans l'historique de rétablissement.
	 * 
	 * @return L'<i>Evenement</i> qui a été retirer de l'historique d'annulation.
	 */
	public Evenement getEvenementPrecedent()
	{
		Evenement e = this.historiqueAnnuler.pop();
		this.historiqueRetablir.add(e);
		
		return e;
	}
	
	
	/**
	 * Cette méthode permet de retirer un <i>Evenement</i> dans l'historique de rétablissement et de l'ajouter dans l'historique d'annulation.
	 * 
	 * @return L'<i>Evenement</i> qui a été retirer de l'historique de rétablissement.
	 */
	public Evenement getEvenementSuivant()
	{
		Evenement e = this.historiqueRetablir.pop();
		this.historiqueAnnuler.add(e);
		
		return e;
	}
	
	
	/**
	 * Cette méthode permet de retirer le dernier <i>Evenement</i> de l'historique d'annulation et de le retourner.
	 * 
	 * @return Le dernier <i>Evenement</i> de l'historique d'annulation.
	 */
	public Evenement popEvenementHistorique()
	{
		return this.historiqueAnnuler.pop();
	}
	
	
	/**
	 * Cette méthode permet de savoir si l'historique d'annulation est vide.
	 * 
	 * @return Vrai si l'historique d'annulation est vide, faux sinon.
	 */
	public boolean isHistoriqueEmpty()
	{
		return this.historiqueAnnuler.isEmpty();
	}
	
	
	/**
	 *  Cette méthode permet de savoir si l'historique de rétablissement est vide.
	 * 
	 * @return Vrai si l'historique de rétablissement est vide, faux sinon.
	 */
	public boolean isHistoriqueRetablirEmpty()
	{
		return this.historiqueRetablir.isEmpty();
	}
	
	
	/**
	 * Cette méthode permet de supprimer l'historique de rétablissement.
	 */
	public void supprimerHistoriqueRetablir()
	{
		this.historiqueRetablir.clear();
	}
	
	
	/**
	 * Cette méthode permet de vérifier si le motif après l'évènement du dernier évènement est égale au motif initial du dernier évènement.
	 *  
	 * @return vrai si le motif après l'évènement du dernier évènement est égale au motif initial du dernier évènement.
	 */
	public boolean motifsDernierEvenementEgaux()
	{
		return this.historiqueAnnuler.lastElement().motifsEgaux();
	}
	
	
	@Override
	public String toString()
	{
		Iterator<Evenement> it = this.historiqueAnnuler.iterator();
		String texte = "";
		
		while(it.hasNext())
			texte += it.next()+"\n";
		
		return texte;
	}
}
